import MarkdownIt from 'markdown-it';
import hljs from 'highlight.js';
import 'highlight.js/styles/github.css';

// 基础配置
const mdBase = {
  html: true,
  linkify: true,
  typographer: true,
  highlight: function (str, lang) {
    if (lang && hljs.getLanguage(lang)) {
      try {
        const highlighted = hljs.highlight(str, { 
          language: lang, 
          ignoreIllegals: true 
        }).value;
        return `<pre class="hljs"><div class="code-header">
          <span class="code-lang">${lang}</span>
        </div><code class="${lang}">${highlighted}</code></pre>`;
      } catch (__) {}
    }
    return `<pre class="hljs"><code>${md.utils.escapeHtml(str)}</code></pre>`;
  },
};
// 用户消息的Markdown实例（不包含文件卡片规则）
const mdUser = new MarkdownIt(mdBase);

// AI消息的Markdown实例（包含文件卡片规则）
const mdAssistant = new MarkdownIt(mdBase);


// 添加文件卡片规则到AI的Markdown实例
mdAssistant.block.ruler.before(
    'paragraph',
    'file_link',
    (state, startLine) => {
      const pos = state.bMarks[startLine];
      const max = state.eMarks[startLine];
      const str = state.src.slice(pos, max);
  
      // 正则匹配文件标签，提取文件类型和地址
      const match = str.match(/^\[file:(\w+)\](.*?)\[\/file\]$/);
      if (!match) return false;
  
      // 创建 token 并保存信息
      const token = state.push('file_link', '', 0);
      token.info = { type: match[1].toLowerCase(), url: match[2].trim() };
  
      // 跳过当前行的后续解析
      state.line = startLine + 1;
      return true;
    }
  );

mdAssistant.renderer.rules.file_link = (tokens, idx) => {
    const { type, url } = tokens[idx].info;

    // 图标映射，根据文件类型设置不同的图标
    const iconMap = {
        pdf: 'file-pdf',
        xls: 'file-excel',
        xlsx: 'file-excel',
        doc: 'file-word',
        docx: 'file-word',
        ppt: 'file-powerpoint',
        pptx: 'file-powerpoint',
        zip: 'file-zipper',
        rar: 'file-zipper',
        default: 'file'
    };

    // 从 URL 中提取文件名
    let fileName = url.split('/').pop() || url;
    try {
        fileName = decodeURIComponent(fileName);
    } catch (e) {
        // 解码失败则保持原样
    }


    return `
        <div class="file-card" onclick="previewFile('${url}')">
        <div class="file-info">
            <div class="file-name">${md.utils.escapeHtml(fileName)}</div>
        </div>
        <div class="file-icon">
            <i class="fa-solid fa-${iconMap[type] || iconMap.default}"></i>
        </div>
        </div>
    `;
    };

// 导出渲染 Markdown 的函数
export const renderMarkdown = (content, isAssistant) => {
    const md = isAssistant ? mdAssistant : mdUser;
    return md.render(content);
  };
  
  // 全局预览/下载文件函数，点击文件卡片时触发
  window.previewFile = function(url) {
    window.open(url, '_blank');
  };